package com.niit.base

object Base_05 {


  /* Java的写法
  class Person{

    private String name;
    public static age = 18

    //构造器的作用：当创建对象的时候，会自动调用类的构造器，默认无参构造器。构造器可以理解为与生俱来的方法
    //无参构造器
    public Person(){

    }
    //参构造器
    public Person(String name){

    }
  }
   */
  // 主构造器： 格式： class 类名(var/val 参数名:类型,var/val 参数名:类型,var/val 参数名:类型=默认值)
  //有参构造器  无参构造器可以直接把括号省略掉 。有参构造器默认会取代无参构造器
  class Person(var name:String,var age:Int,var phone:Int=110){

    //辅助构造器 辅助构造器方法名必须叫 this。格式 def this(参数:类型,参数:类型){}
    def this(arr:Array[String]){//数组，在实例化的时候，直接传了一个带有两个数据的数组
      //第一行必须调用主构造器
      this("王五",19)
      println("辅助构造器",arr(0),arr(1))
    }

    println(name,age,phone)
  }

  /*
    在Scala是没有static 如果想使用静态只能够定义单例对象
    object 对象名{}
    调用：对象名.属性 进行调用
   */
  object Dog{
    val leg_num = 4

    def printStart(num:Int): Unit ={
      println("*"*num)
    }

  }
  //在Java中，类里面可以定义成员变量和静态变量以及成员方法和静态方法，如果想在Scala实现这一效果就要用到 伴生对象
  /*
    一个class 和 一个 object的名字是相同的，那么就叫做伴生。object为伴生对象，class为伴生类
    并且 这个class 和 object必须在同一个文件当中
    伴生对象和伴生类可以互相访问private属性
   */

  class Generals{
      def gan(): Unit ={
        println("拿着"+Generals.armsName+"就是干")
        //Generals.printInfo()
      }
  }
       //互为伴生
  object Generals{
         private var armsName = "青龙偃月刀"
         private[this] def printInfo(): Unit ={
           println("手握"+armsName)
         }
       }

  //apply方法免去new的方式进行实例化
  class Animal(var name:String,var age:Int = 2)//只有类才能实例化
  object Animal{
    def apply(name: String,age: Int ):Animal = new Animal(name,age) //在半生对象中进行的实例化
  }

  def main(args: Array[String]): Unit = {

    var generals = new Generals;
    generals.gan()

    //    var p = new Person("张三",18)
    //    println(p.name)
    //    var pp = new Person(Array("二狗","北京"))
    //
    //    println(Dog.leg_num)
    //    Dog.printStart(30)
    val ani = Animal("狗",3)


  }

}
